//////////////////////////////////////////////////////////////////////////

#ifndef _CONNECTION_H_
#define _CONNECTION_H_

//////////////////////////////////////////////////////////////////////////

#ifndef _OBSERVABLE_H_
#include "observable.h"
#endif

#include <list>

//////////////////////////////////////////////////////////////////////////

class Packet;
class ConnectionImpl;

//////////////////////////////////////////////////////////////////////////


/** Network connection
*
*  @author   Pasechnik Roman
*  @since    Jun 29th, 2009
*  @updated  Sep 08th, 2009
*/
class Connection : public Observable,
                   public Observer
{
//////////////////////////////////////////////////////////////////////////

public:

//////////////////////////////////////////////////////////////////////////


    /** Constructor */
    Connection();


    /** Destructor */
    virtual ~Connection();


//////////////////////////////////////////////////////////////////////////


    /** Send TCP */
    void SendTCP( const Packet& _packet );


    /** Send UDP */
    void SendUDP( const Packet& _packet );


//////////////////////////////////////////////////////////////////////////


    /** Recv TCP */
    const Packet& GetRecvPacketTCP() const;


    /** Recv UDP */
    const Packet& GetRecvPacketUDP() const;


//////////////////////////////////////////////////////////////////////////


    /** Connect to server (client only) */
    void Connect( const char* _address );


    /** Accept new connection (server only) */
    void Accept();


    /** Close connection */
    void Close();


////////////////////////////////////////////////////////////////////////////////
//// Observer interface implementation
////////////////////////////////////////////////////////////////////////////////


    /** Notify observer about event */
    virtual void OnEvent( Event _event, Observable* _observable );


////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////

private:

//////////////////////////////////////////////////////////////////////////


    /** Connection impl */
    ConnectionImpl* m_Impl;


//////////////////////////////////////////////////////////////////////////

};


//////////////////////////////////////////////////////////////////////////

#endif

//////////////////////////////////////////////////////////////////////////
